<?php
namespace app\service\MessageParser;

/**
 * 消息解析工厂类
 * 根据厂商类型创建对应的消息解析器
 */
class MessageParserFactory
{
    /**
     * 已注册的消息解析器
     * @var array
     */
    private static $parsers = [];

    /**
     * 初始化工厂（注册所有可用的解析器）
     */
    public static function init(): void
    {
        if (empty(self::$parsers)) {
            self::register('vendor1', Vendor1MessageParser::class);
            self::register('vendor2', Vendor2MessageParser::class);
            self::register('mqttx', Vendor2MessageParser::class); // MQTTX是Vendor2的别名
        }
    }

    /**
     * 注册消息解析器
     *
     * @param string $name 解析器名称
     * @param string $className 解析器类名
     */
    public static function register(string $name, string $className): void
    {
        self::$parsers[$name] = $className;
    }

    /**
     * 创建消息解析器
     *
     * @param string $vendor 厂商名称
     * @return MessageParserInterface 消息解析器实例
     * @throws \Exception
     */
    public static function create(string $vendor): MessageParserInterface
    {
        self::init();

        $vendor = strtolower(trim($vendor));

        if (!isset(self::$parsers[$vendor])) {
            throw new \Exception("不支持的消息解析器: {$vendor}");
        }

        $className = self::$parsers[$vendor];

        if (!class_exists($className)) {
            throw new \Exception("消息解析器类不存在: {$className}");
        }

        $instance = new $className();

        if (!($instance instanceof MessageParserInterface)) {
            throw new \Exception("消息解析器类必须实现MessageParserInterface: {$className}");
        }

        return $instance;
    }

    /**
     * 自动检测并创建合适的消息解析器
     * 尝试所有已注册的解析器，返回第一个能处理该消息的
     *
     * @param string $topic MQTT主题
     * @param array $messageData 消息数据
     * @return MessageParserInterface|null 合适的解析器，或null
     */
    public static function detect(string $topic, array $messageData): ?MessageParserInterface
    {
        self::init();

        foreach (self::$parsers as $name => $className) {
            try {
                $parser = self::create($name);
                if ($parser->canHandle($topic, $messageData)) {
                    return $parser;
                }
            } catch (\Throwable $e) {
                // 继续尝试下一个解析器
            }
        }

        return null;
    }

    /**
     * 获取所有已注册的解析器
     * 
     * @return array 解析器列表
     */
    public static function getAvailableParsers(): array
    {
        self::init();
        return array_keys(self::$parsers);
    }
}

